package org.cuatrovientos.ruleta;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Random;
import java.util.Scanner;

/**
 * Clase para simular un juego de ruleta de casino
 * en el que juegan 4 personas.
 * @author Pello Xabier Altadill Izura
 *
 */
public class Ruleta {
	private Connection connection;
	private long ronda = 0;
	private int [] dineroPorJugador = new int[]{500,500,500,500};
	private int numeroApostado = 0;
	private int totalDineroApostado = 0;
	private int numeroGanador = 0;
	
	/**
	 * este método condensa todo, sobran las explicaciones
	 */
	public void jugar () {

		 try {
			 
			 	iniciarRonda();
			 
				apuestasJugadores();
                
                calcularGanador();

        		comprobarGanadores();
			    
			    mostrarDineroJugadores();
			    
			    
		// problem?
		  } catch (SQLException sqle) {
			  System.err.println("SQL Exception: " + sqle.getMessage());
		  } catch (Exception e) {
			  System.err.println("Exception: " + e.getMessage());
		  }
	}

	/**
	 * @throws SQLException
	 * @throws ClassNotFoundException 
	 */
	private void comprobarGanadores() throws SQLException, ClassNotFoundException {
	 	connect();
	 	
		// Ahora vamos a ver si alguien gana
		// Creamos la sentencia
		PreparedStatement prep = connection.prepareStatement("select * from apuesta where ronda=? order by id");

		prep.setLong(1, ronda);
		// Seleccionamos los datos, y los mostramos
		ResultSet rs = prep.executeQuery();
		int j = 0;
		int n = 0;
		System.out.println("Resultado de ronda " + ronda);
		System.out.println("Número ganador: " + numeroGanador);
		while (rs.next()) {
		  System.out.print(rs.getInt("id"));
		  System.out.print(".- " + rs.getString("nombre"));
		  System.out.print("\t: " + rs.getInt("cantidad"));
		  n = rs.getInt("numero");
		  System.out.print("\t: " + n);
		  if (n == numeroGanador) {
			  System.out.print(" HA GANADO!! ");
			  dineroPorJugador[j] += totalDineroApostado;
		  }
		  System.out.print("\n");
		  j++;
		}
   
		
		// Cerramos el ResultSet
		rs.close();
		
	    close();
	}

	/**
	 * 
	 */
	private void calcularGanador() {
		// Calculamos el número que sale en la ruleta:
		Random r = new Random();

		// Un número entre 1 y 42
		numeroGanador = r.nextInt(42) + 1;
	}

	/**
	 * @throws SQLException
	 */
	private void close() throws SQLException {
		// Cerramos la conexión con la BBDD.
		connection.close();
	}

	/**
	 * @param rd
	 * @throws SQLException
	 * @throws ClassNotFoundException 
	 */
	private void apuestasJugadores() throws SQLException, ClassNotFoundException {
		
		// La cantidad que tiene cada
		Scanner lectorConsola = new Scanner(System.in);
		int cantidad;
				
            // Le pedimos a cada jugador que apueste.
		for (int i = 0; i < 4; i++) {
			// Si el jugador en concreto no tiene pasta, saltamos este bucle
			if (dineroPorJugador[i] > 0) { 
			
		    	// Le pedimos al jugador la pasta que va a poner
		    	do {
		    		System.out.println("Jugador "+ i + " introduzca cantidad dinero a apostar: ");
		    		cantidad = lectorConsola.nextInt();
		    	} while (cantidad <= 0 || cantidad > dineroPorJugador[i]);
		    	
		    	// Agregamos al total de dinero apostado la cantidad que ha metido el jugador
		    	totalDineroApostado = totalDineroApostado + cantidad;
		    	
		    	// Quitamos la cantidad apostada de la pasta del jugador
		    	dineroPorJugador[i] = dineroPorJugador[i] + cantidad;
		    	
		    	// Le pedimos al jugador a qué número apuesta.
		    	do {
		    		System.out.println("Jugador "+ i + " introduzca el número por el que apuesta: ");
		    		numeroApostado = lectorConsola.nextInt();
		    	} while (numeroApostado <= 0 || numeroApostado > 42);
		   
		        insertarApuesta("Jugador " + (i+1), cantidad, numeroApostado, ronda);
			}
		}

	}

	/**
	 * 
	 */
	private void iniciarRonda() {
		// Este número lo usaremos para identificar
		 // la apuesta en la que estamos
		 ronda = System.currentTimeMillis();
		 
		 numeroApostado = 0;
		 totalDineroApostado = 0;
	}

	/**
	 * 
	 */
	public void mostrarDineroJugadores() {
		// Mostramos cómo quedan los jugadores
		System.out.println("Situación de los jugadores ");
		for (int i = 0; i < 4; i++) {
			System.out.print("Jugador " + i + ": ");
			System.out.println(dineroPorJugador[i] + "$ ");
		}
	}

	/**
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	private void connect() throws ClassNotFoundException, SQLException {
		// Conectamos a la BD ruleta
		Class.forName("org.sqlite.JDBC");
		connection = DriverManager.getConnection("jdbc:sqlite:ruleta.db");
	}
	
	
	/**
	 * @param rd
	 * @throws SQLException
	 * @throws ClassNotFoundException 
	 */
	public void eliminarTodos ()  {
		try {
			connect();
			// Con este prepared statement insertaremos las apuestas.
			Statement statement = connection.createStatement();
			statement.executeUpdate("delete from apuesta;");
			close();
		} catch (SQLException sqle) {
			System.err.println("Excepción SQL " + sqle.getMessage());
		} catch (ClassNotFoundException cnfe) {
			System.err.println("Excepción Class not found " + cnfe.getMessage());			
		}
	}
	
	/**
	 * @param rd
	 * @return datos de la tabla
	 */
	public String seleccionarTodos ()  {
		String resultado = "";
		try {
			connect();
			// Con este prepared statement insertaremos las apuestas.
			Statement statement = connection.createStatement();
			ResultSet resultSet = statement.executeQuery("select * from apuesta;");
			
			while (resultSet.next()) {
				// nombre,cantidad, numero, ronda
				resultado = resultado + resultSet.getString("nombre")+",";
				resultado = resultado + resultSet.getInt("cantidad")+",";
				resultado = resultado + resultSet.getInt("numero")+",";
				resultado = resultado + resultSet.getInt("ronda")+"\n";
			}
			
			close();
		} catch (SQLException sqle) {
			System.err.println("Excepción SQL " + sqle.getMessage());
		} catch (ClassNotFoundException cnfe) {
			System.err.println("Excepción Class not found " + cnfe.getMessage());			
		}
		
		return resultado;
	}

	/**
	 * inserta una nueva apuesta
	 * @param nombre
	 * @param cantidad
	 * @param numero
	 * @param ronda
	 */
	public void insertarApuesta (String nombre, int cantidad, int numero, long ronda)  {
		try {
			connect();
			// Con este prepared statement insertaremos las apuestas.
			// Con este prepared statement insertaremos las apuestas.
			PreparedStatement preparedStatement = connection.prepareStatement(
			          "insert into apuesta (nombre,cantidad, numero, ronda) values (?,?,?,?);");
			
			preparedStatement.setString(1, nombre);
			preparedStatement.setInt(2, cantidad);
			preparedStatement.setInt(3, numero);
			preparedStatement.setLong(4, ronda);
			preparedStatement.addBatch();
			preparedStatement.executeBatch();
			//ResultSet resultSet=preparedStatement.getGeneratedKeys().;
			close();
			
		} catch (SQLException sqle) {
			System.err.println("Excepción SQL " + sqle.getMessage());
		} catch (ClassNotFoundException cnfe) {
			System.err.println("Excepción Class not found " + cnfe.getMessage());			
		}
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Ruleta rul = new Ruleta();
		while (true)
			rul.jugar();
	}

}
